/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package xsystems.parserFile;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import xsystems.GUI.Principal;
import xsystems.propagationModel.ImportedModel;
import xsystems.propagationModel.Point;

/**
 * Essa classe possui métodos para gravação, recuperação e exclusão de objetos
 * serializados armazenados em disco. Além de possuir uma rotina para escolha de
 * diretório.
 *
 * @author Rafael Tosta
 */
public class MyUtility {

    public static File pastaPadrao = new File("Import File");
    public static File pastaParametros = new File("Temp Files");

    private static void criaDiretorioPadrao() {
        if (!pastaPadrao.exists()) {
            pastaPadrao.mkdir();
        }
    }

    private static void criaDiretorioParametros() {
        if (!pastaParametros.exists()) {
            pastaParametros.mkdir();
        }
    }

    public static String[] importFiles() {
        MyUtility.criaDiretorioPadrao();
        return pastaPadrao.list();
    }

    public static void gravaParametros(String nome, String[] p) {
        criaDiretorioParametros();
        File arq = new File(pastaParametros, nome + ".param");
        try {
            arq.createNewFile();
            FileWriter fileWriter = new FileWriter(arq, false);
            PrintWriter printWriter = new PrintWriter(fileWriter);

            for (int i = 0; i < p.length; i++) {
                printWriter.println(p[i]);
            }

            printWriter.flush();
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
    public static void gravaData(File f, String nome, ArrayList<Point> a) {
        criaDiretorioParametros();
        File arq = new File(f, nome + ".csv");
        try {
            arq.createNewFile();
            FileWriter fileWriter = new FileWriter(arq, false);
            PrintWriter printWriter = new PrintWriter(fileWriter);

            for (int i = 0; i < a.size(); i++) {
                printWriter.println(a.get(i).getX()+","+a.get(i).getY());
            }

            printWriter.flush();
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static ArrayList<String> lerParametros(String nome) {
        File arq = new File(pastaParametros, nome + ".param");
        ArrayList<String> p = new ArrayList<>();

        if (!arq.isFile()) {
            return null;
        }

        try {

            FileReader fileReader = new FileReader(arq);
            BufferedReader bufferedReader
                    = new BufferedReader(fileReader);

            String linha = "";

            while ((linha = bufferedReader.readLine()) != null) {
                p.add(linha);
            }

            fileReader.close();
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return p;
    }

    public static void gravaObjetoParser(ImportedModel p, String nomeFile) {
        criaDiretorioPadrao();
        File f = new File(pastaPadrao, nomeFile + ".tm");
        FileOutputStream arquivoGrav = null;
        try {
            //Gera o arquivo para armazenar o objeto
            arquivoGrav = new FileOutputStream(f);
            //Classe responsavel por inserir os objetos
            ObjectOutputStream objGravar = new ObjectOutputStream(arquivoGrav);

            //Grava o objeto cliente no arquivo
            objGravar.writeObject(p);
            objGravar.flush();
            objGravar.close();
            arquivoGrav.flush();
            arquivoGrav.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error ao importar arquivo:\n" + e.toString(), "Erro", 0);
            try {
                arquivoGrav.close();
                boolean delete = f.delete();
            } catch (IOException ex) {

            }
        }
    }

    public static ImportedModel recuperaObjetoParser(String nomeFile) {
        File f = new File(pastaPadrao, nomeFile);

        ObjectInputStream objLeitura;
        ImportedModel p = null;
        try {
            //Carrega o arquivo
            FileInputStream arquivoLeitura = new FileInputStream(f);
            //Classe responsavel por recuperar os objetos do arquivo
            objLeitura = new ObjectInputStream(arquivoLeitura);
            p = (ImportedModel) objLeitura.readObject();
            objLeitura.close();
            arquivoLeitura.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return p;
    }

    public static void deleteFile(String nome) {
        File f = new File(pastaPadrao, nome + ".tm");
        f.delete();
    }

    public static File FileChooser(Principal p) {
        File file = null;

        JFileChooser e = new JFileChooser();
        e.setFileSelectionMode(JFileChooser.FILES_ONLY);
        e.setDialogTitle("Choose a file");
        int returnVal = e.showOpenDialog(p);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = e.getSelectedFile();
        }

        return file;
    }

    public static File FileChooserSave(Principal p) {
        File file = null;

        JFileChooser e = new JFileChooser();
        e.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        e.setDialogTitle("Save a file");        
        int returnVal = e.showSaveDialog(p);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = e.getSelectedFile();
        }

        return file;
    }
}
